/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package occho.data;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author Jorge
 */
public class OracleDAOFactory {
    
    /**
     * Driver de la base de datos
     */
    public static final String DRIVER = "oracle.jdbc.driver.OracleDriver";
    /**
     * Datos de conexion
     */
    public static final String DBURL  = "jdbc:oracle:thin:inftel11_19/inftel@olimpia.lcc.uma.es:1521:edgar";
    private static OracleDAOFactory instancia=null;
    private Connection conn;
    
    private OracleDAOFactory() throws ClassNotFoundException, SQLException{
        Class.forName(DRIVER);
        this.conn=DriverManager.getConnection(DBURL);
    }
    
    /**
     * Devuelve una la instancia de la clase.
     * @return Una objeto de la clase OracleDAOFactory
     * @throws ClassNotFoundException
     * @throws SQLException
     */
    public static OracleDAOFactory getInstancia() throws ClassNotFoundException, SQLException{
        if(instancia==null){
            instancia=new OracleDAOFactory();
        }
        return instancia;
    }
    
    /**
     * Devuelve una instancia de OracleAsignaturaDAO
     * @return Un objeto de la clase AsignaturaDAO
     * @throws SQLException
     * @throws ClassNotFoundException
     */
    public AsignaturaDAO getAsignaturaDAO() throws SQLException, ClassNotFoundException {
        return new OracleAsignaturaDAO(this.conn);
    }
    
    /**
     * Devuelve una instancia de OraclePreguntaDAO
     * @return Un objeto de la clase PreguntaDAO
     * @throws SQLException
     * @throws ClassNotFoundException
     */
    public PreguntaDAO getPreguntaDAO() throws SQLException, ClassNotFoundException {
        return new OraclePreguntaDAO(this.conn);
    }
    
    /**
     * Devuelve una instancia de OracleRespuestaDAO
     * @return RespuestaDAO
     * @throws SQLException
     * @throws ClassNotFoundException
     */
    public RespuestaDAO getRespuestaDAO() throws SQLException, ClassNotFoundException {
        return new OracleRespuestaDAO(this.conn);
    }
    
    /**
     * Devuelve una instancia de OracleTemaDAO
     * @return TemaDAO
     * @throws ClassNotFoundException
     * @throws SQLException
     */
    public TemaDAO getTemaDAO() throws ClassNotFoundException, SQLException {
        return new OracleTemaDAO(this.conn);
    }
    
    /**
     * Devuelve una instancia de OracleTestDAO
     * @return TestDAO
     * @throws ClassNotFoundException
     * @throws SQLException
     */
    public TestDAO getTestDAO() throws ClassNotFoundException, SQLException {
        return new OracleTestDAO(this.conn);
    }
    
    /**
     * Devuelve una instancia de OraclePreguntaAlumnoDAO
     * @return Un objeto de la clase PreguntaAlumnoDAO
     * @throws ClassNotFoundException
     * @throws SQLException
     */
    public PreguntaAlumnoDAO getPreguntaAlumnoDAO() throws ClassNotFoundException, SQLException {
        return new OraclePreguntaAlumnoDAO(this.conn);
    }
    
    /**
     * Devuelve una instancia de OracleUsuarioDAO
     * @return UsuarioDAO
     * @throws ClassNotFoundException
     * @throws SQLException
     */
    public UsuarioDAO getUsuarioDAO() throws ClassNotFoundException, SQLException {
        return new OracleUsuarioDAO(this.conn);
    }
    
    /**
     * Devuelve una instancia de OracleLogDAO
     * @return Un objeto de la clase LogDAO
     * @throws ClassNotFoundException
     * @throws SQLException
     */
    public LogDAO getLogDAO() throws ClassNotFoundException, SQLException {
        return new OracleLogDAO(this.conn);
    }
    
    /**
     * Cierra la conexion
     */
    public static void closeConnection() {
        try {
            if (instancia != null) {
                if (instancia.conn != null) {
                    instancia.conn.close();
                }
            }
        } catch (SQLException ex) {
            Logger.getLogger(OracleDAOFactory.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
}
